package cn.lg.soar.system.api.service;

import cn.lg.soar.common.util.current.UserContext;
import cn.lg.soar.common.util.token.LoginInfo;
import cn.lg.soar.system.api.model.TokenInfoDTO;

/**
 * @author luguoxiang
 * @date 2022/4/6
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface ILoginApi {

    /**
     * 登录
     * @param loginInfo 登录信息
     * @param refreshExpires 刷新token有效期
     * @return
     */
    TokenInfoDTO login(LoginInfo loginInfo, long refreshExpires);

    /**
     * 登录
     * @param loginInfo 登录信息
     * @param rememberMe 是否记住我
     * @return
     */
    TokenInfoDTO login(LoginInfo loginInfo, boolean rememberMe);

    /**
     * 登录
     * @param userId 用户id
     * @param refreshExpires 刷新token有效期
     * @return
     */
    default TokenInfoDTO login(Long userId, long refreshExpires) {
        LoginInfo loginInfo = new LoginInfo(userId, 0);
        return login(loginInfo, refreshExpires);
    }

    /**
     * 登录
     * @param userId 用户id
     * @param rememberMe 是否记住我
     * @return
     */
    default TokenInfoDTO login(Long userId, boolean rememberMe) {
        LoginInfo loginInfo = new LoginInfo(userId, 0);
        return login(loginInfo, rememberMe);
    }

    /**
     * 指定token退出登录
     * @param tokenId
     */
    void logoutByTokenId(Long tokenId);

    /**
     * 当前用户退出登录
     */
    default void logout() {
        logoutByTokenId(UserContext.getUser().getTokenId());
    }


    /**
     * 指定用户退出登录
     * @param userId
     */
    void logout(Long userId);

    /**
     * 指定用户指定终端退出登录
     * @param userId
     * @param clientType
     */
    void logout(Long userId, Integer clientType);

}
